#!/usr/bin/env python
# -*- coding: utf-8 -*-
import bisect

#Entrada edificios (izq,alt,der)
#Entrada de ejemplo del enunciado
a = [

(4,15,10),
(2,11,9),
(7,7,18),
(12,13,16),
(20,9,28),
(22,20,25),
(26,13,29)
]

#Entrada con edificios solapados
#a = [
#(22,20,25),
#(24,13,29),
#(25,13,29),
#(26,13,29),
#(27,13,29),
#(28,13,29),
#(27,13,33)
#]


id=0
flancos = []
#Desgloso los edificios en flancos de subida y bajada
for p in a:
	#subida
	flancos.append((p[0],p[1],True,id))
	#bajada
	flancos.append((p[2],p[1],False,id))
	id += 1

flancos.sort()
alturas = []#Estructura que contendra las alturas de los edificios(inserción ordenada)
bisect.insort_left(alturas,(0,-1))#Inserto el piso, altura=0.


solCandidata = (flancos[0][0],flancos[0][1])#Solucion candidata, se usa para poder comparar con edificioActual y evitar problemas de solapamiento, la solución se imprimirá cdo se sepa que no está solapada
edificioActual = (flancos[0][1],flancos[0][3])#Edificio que se está "dibujando" actualmente

for flanco in flancos[1:]:
	#Si el flanco que encontre corresponde al edificio actual entonces es un flanco de bajada
	#Caso 4
	if(flanco[3] == edificioActual[1] ):
		#Para evitar problema de edificios solapados por flanco de bajada
		#No se agrega a la solución a menos que la altura sea diferente
		if(edificioActual[0]!=alturas[-1][0]):
			print(solCandidata)
			solCandidata = (flanco[0],alturas[-1][0])

		edificioActual = alturas.pop()
	#El flanco encontrado es de subida, por ende, corresponde a otro edificio
	elif(flanco[2]):		
		#si la altura es mayor a la actual
		#Se agrega a la solucion
		#Caso 1
		if(flanco[1]>edificioActual[0]):
			#Para evitar problema de edificios solapados por flanco de subida
			if(flanco[0] != solCandidata[0]):
				print(solCandidata)

			solCandidata = (flanco[0],flanco[1])
			bisect.insort_left(alturas,edificioActual)
			edificioActual = (flanco[1],flanco[3])
		#Flanco de subida con altura menor o igual a la del edificio actual
		#Caso 5
		else:

			bisect.insort_left(alturas,(flanco[1],flanco[3]))
	#Si el flanco encontrado es de bajada y no es del edificio actual
	#Caso 2
	else:
		alturas.remove((flanco[1],flanco[3]))

print solCandidata
	
